package com.zukxu.items.common.response;

import lombok.Getter;
import lombok.ToString;

/**
 * <p>
 * 封装返回
 * </p>
 *
 * @author zukxu
 * @date 2020/12/23 0023 16:22
 */

@Getter
@ToString
public class Res<T> {
	/**
	 * 业务码
	 */
	private Integer code;
	/**
	 * 信息描述
	 */
	private String message;
	/**
	 * 返回参数
	 */
	private T data;

	private Res(ResultStatus resultStatus, T data) {
		this.code = resultStatus.getCode();
		this.message = resultStatus.getMessage();
		this.data = data;
	}

	/**
	 * 业务成功返回业务代码和描述信息
	 */
	public static Res<Void> success() {
		return new Res<Void>(ResultStatus.SUCCESS, null);
	}

	/**
	 * 业务成功返回业务代码,描述和返回的参数
	 */
	public static <T> Res<T> success(T data) {
		return new Res<T>(ResultStatus.SUCCESS, data);
	}

	/**
	 * 业务成功返回业务代码,描述和返回的参数
	 */
	public static <T> Res<T> success(ResultStatus resultStatus, T data) {
		if (resultStatus == null) {
			return success(data);
		}
		return new Res<T>(resultStatus, data);
	}

	/**
	 * 业务异常返回业务代码和描述信息
	 */
	public static <T> Res<T> fail() {
		return new Res<T>(ResultStatus.INTERNAL_SERVER_ERROR, null);
	}

	/**
	 * 业务异常返回业务代码,描述和返回的参数
	 */
	public static <T> Res<T> fail(ResultStatus resultStatus) {
		return fail(resultStatus, null);
	}

	/**
	 * 业务异常返回业务代码,描述和返回的参数
	 */
	public static <T> Res<T> fail(ResultStatus resultStatus, T data) {
		if (resultStatus == null) {
			return new Res<T>(ResultStatus.INTERNAL_SERVER_ERROR, null);
		}
		return new Res<T>(resultStatus, data);
	}
}